#!/bin/bash

# 启用错误检查和安全模式
set -euo pipefail

echo "=== 开始安装ESP-IDF v5.4.2 ==="

# 定义常量
ESP_DIR="$HOME/esp"
GITEE_TOOLS_DIR="$ESP_DIR/esp-gitee-tools"
IDF_DIR="$ESP_DIR/esp-idf"
IDF_VERSION="v5.4.2"
MIRROR_URL="https://gitee.com/EspressifSystems"

# 1. 安装系统依赖
echo ">>> 步骤1/6: 安装系统依赖"
sudo apt-get update
sudo apt-get install -y git wget flex bison gperf python3 python3-pip \
    python3-venv cmake ninja-build ccache libffi-dev libssl-dev \
    dfu-util libusb-1.0-0

# 2. 设置esp-gitee-tools
echo ">>> 步骤2/6: 配置ESP镜像工具"
mkdir -p "$ESP_DIR"
if [[ ! -d "$GITEE_TOOLS_DIR" ]]; then
    git clone "${MIRROR_URL}/esp-gitee-tools.git" "$GITEE_TOOLS_DIR"
else
    echo "检测到已存在的esp-gitee-tools，尝试更新..."
    cd "$GITEE_TOOLS_DIR" && git pull
fi

export PATH="$PATH:$GITEE_TOOLS_DIR"
bash "$GITEE_TOOLS_DIR/jihu-mirror.sh" set

# 3. 克隆/更新ESP-IDF (增加错误处理和重试)
echo ">>> 步骤3/6: 获取ESP-IDF ($IDF_VERSION)"
MAX_RETRIES=3
retry_count=0
clone_success=false

# 尝试克隆/更新仓库，最多重试3次
while [[ $retry_count -lt $MAX_RETRIES && $clone_success == false ]]; do
    if [[ ! -d "$IDF_DIR" ]]; then
        echo "尝试克隆esp-idf (尝试 $((retry_count+1))/$MAX_RETRIES)..."
        if git clone -b "$IDF_VERSION" "${MIRROR_URL}/esp-idf.git" "$IDF_DIR"; then
            clone_success=true
        else
            echo "克隆失败，清理后重试..."
            rm -rf "$IDF_DIR"  # 删除可能损坏的目录
        fi
    else
        echo "检测到已存在的esp-idf，尝试更新 (尝试 $((retry_count+1))/$MAX_RETRIES)..."
        cd "$IDF_DIR"
        # 重置本地仓库状态
        git reset --hard
        git clean -fdx
        
        # 修复可能损坏的引用
        git remote set-head origin -a
        
        if git fetch origin && git checkout "$IDF_VERSION" && git reset --hard "origin/$IDF_VERSION"; then
            clone_success=true
        else
            echo "更新失败，清理后重试..."
            cd ..
            rm -rf "$IDF_DIR"  # 删除损坏的目录
        fi
    fi
    
    if ! $clone_success; then
        retry_count=$((retry_count+1))
        echo "等待5秒后重试..."
        sleep 5
    fi
done

if ! $clone_success; then
    echo "错误：无法获取ESP-IDF，请检查网络连接和版本是否存在。" >&2
    exit 1
fi

# 4. 更新子模块 (增加错误处理和重试)
echo ">>> 步骤4/6: 更新子模块 (使用镜像加速)"
cd "$IDF_DIR"
retry_count=0
max_retries=3

while [[ $retry_count -lt $max_retries ]]; do
    echo "尝试更新子模块 (尝试 $((retry_count+1))/$max_retries)..."
    # 使用gitee工具更新子模块
    if bash "$GITEE_TOOLS_DIR/submodule-update.sh" "$IDF_DIR"; then
        break
    else
        retry_count=$((retry_count+1))
        echo "子模块更新失败，等待5秒后重试..."
        sleep 5
        
        # 如果多次失败，尝试手动修复
        if [[ $retry_count -ge $max_retries ]]; then
            echo "尝试手动修复子模块..."
            git submodule sync
            git submodule update --init --recursive --force
        fi
    fi
done

if [[ $retry_count -eq $max_retries ]]; then
    echo "错误：更新子模块失败，请检查网络。" >&2
    exit 1
fi

# 5. 安装工具链
echo ">>> 步骤5/6: 安装工具链 (可能需要较长时间)"
bash "$GITEE_TOOLS_DIR/install.sh" 

# 6. 验证安装
echo ">>> 步骤6/6: 验证安装"
source "$IDF_DIR/export.sh"
if idf.py --version &>/dev/null; then
    echo -e "\n\033[32m安装成功!\033[0m"
    echo "工具链路径: $HOME/.espressif"
    echo "镜像工具路径: $GITEE_TOOLS_DIR"
    echo "ESP-IDF路径: $IDF_DIR"
    echo "使用命令: source $IDF_DIR/export.sh"
else
    echo -e "\n\033[31m安装验证失败!\033[0m" >&2
    exit 1
fi
